import { IMiddleware } from '@midwayjs/core';
import { Middleware ,Inject } from '@midwayjs/decorator';
import { NextFunction, Context } from '@midwayjs/koa';
import { JwtService } from '@midwayjs/jwt';
import config  from '../private/clienconfig'

@Middleware()
export class AdminMiddleware implements IMiddleware<Context, NextFunction> {
    @Inject()
    jwtService: JwtService;
    // @Inject()
    // content:Context

    resolve() {
    return async (ctx: Context, next: NextFunction) => {
      
      console.log( "loginurl",ctx.url );
     
      let result;
//    得到token 我们需要解析一下是否 正确 
//  如果 是登录页面我们就 直接next() 不需要token校验
      if(  this.match(ctx) ){
          


        var  token  = ctx.header['authorization']
        // console.log(  'token' ,token );
        if(!token){
            return { 
               code:50008,
               message:"暂无权限"
            }
        }
        token = token.replace("Bearer ","")
     
         try{ 
        var user =   await  this.jwtService.verify(token,config.secret , { complete: true,})
          // console.log( "中间件的userinfotoken校验", userresult);
          console.log( "添加用户身份",user);
          ctx.user={
            role:[]
          }
    

       
          // if(JSON.parse(JSON.stringify(user)).payload.isagent == true ){
          //   console.log("赋权agent");
            
          //   ctx.user.role.push('agent')
          // }
          // if(JSON.parse(JSON.stringify(user)).payload.username == 'admin' ){
          //   console.log("赋权admin");
          //   ctx.user.role.push('admin')
          // }
              
           result = await next();
         }catch (err){ 
          // console.log( "asdasdasd",ctx.URL);
              console.log( "登录错误",err.name);
              console.log(err);
              
          if(   err.name   == 'ForbiddenError'){
            return  {   
              code:40004,
              msg:"无权限访问"
        }
          }

              return  {   
                      code:50008,
                      msg:"请重新登录"
                }
         }

      }else{
          // console.log(ctx.header);
     
          result = await next();
      
      }
      
      return result;
    };
  }

  // ignore 函数名 ( , ctx :  req   ) : boolean    
    //   : boolean     该函数返回出来的数据类型 为 布尔值
  // ignore(ctx: Context): boolean {
  //   // 下面的路由将忽略此中间件
  //   var arr = ['/user/checkusername','/user/login','/user/register'] 

  //   return arr.some((v)=>    ctx.url == v  )
  // }

  match(ctx: Context): boolean {
    // 下面的匹配到的路由会执行此中间件
    if (ctx.path.includes('/admin')) {
      return true;
    }
  }

  static getName(): string {
    return 'userlogin';
  }
}